import { API_CONFIG, RESPONSE_CODE } from '@/api/config.js'

/**
 * API响应处理工具类
 */
export class ApiResponseHandler {
  /**
   * 处理API响应
   * @param {Object} response - API响应
   * @param {Object} options - 处理选项
   * @returns {Object} 处理后的数据
   */
  static handleResponse(response, options = {}) {
    const { 
      showSuccessMessage = false, 
      successMessage = '操作成功',
      showErrorMessage = true,
      errorMessage = '操作失败'
    } = options

    const payload = response?.data || response
    const ok = payload?.code === RESPONSE_CODE.SUCCESS || payload?.success === true

    if (ok) {
      if (showSuccessMessage) {
        this.showMessage(successMessage, 'success')
      }
      return {
        success: true,
        data: payload.data ?? payload.result ?? payload.page ?? payload,
        message: payload.message || payload.msg || successMessage
      }
    } else {
      const errorMsg = payload?.message || payload?.msg || errorMessage
      if (showErrorMessage) {
        this.showMessage(errorMsg, 'error')
      }
      return {
        success: false,
        data: null,
        message: errorMsg
      }
    }
  }

  /**
   * 处理分页数据
   * @param {Object} data - 分页数据
   * @returns {Object} 处理后的分页数据
   */
  static handlePageData(data) {
    if (!data) return { records: [], total: 0 }

    // 兼容多种分页结构
    const page = data.records ? data
      : data.page?.records ? data.page
      : data.data?.records ? data.data
      : data

    const records = page?.records || []
    let total = page?.total

    if (total === undefined || total === null) {
      total = page?.totalCount ?? page?.count
    }

    // 若后端 total=0 但返回了数据，做兜底修正
    if ((total === 0 || total === '0') && Array.isArray(records) && records.length > 0) {
      total = records.length
    }

    if (total === undefined || total === null) {
      total = Array.isArray(records) ? records.length : 0
    }

    return {
      records,
      total: Number(total || 0)
    }
  }

  /**
   * 显示消息
   * @param {string} message - 消息内容
   * @param {string} type - 消息类型
   */
  static showMessage(message, type = 'info') {
    // 这里需要根据项目使用的UI库来调整
    // 假设使用Element Plus
    if (typeof window !== 'undefined' && window.ElMessage) {
      window.ElMessage[type](message)
    } else {
      console.log(`[${type.toUpperCase()}] ${message}`)
    }
  }
}

/**
 * 分页参数构建器
 */
export class PaginationBuilder {
  constructor() {
    this.params = {
      pageNum: 1,
      pageSize: 10
    }
  }

  /**
   * 设置页码
   * @param {number} pageNum - 页码
   * @returns {PaginationBuilder}
   */
  pageNum(pageNum) {
    this.params.pageNum = pageNum
    return this
  }

  /**
   * 设置每页条数
   * @param {number} pageSize - 每页条数
   * @returns {PaginationBuilder}
   */
  pageSize(pageSize) {
    this.params.pageSize = pageSize
    return this
  }

  /**
   * 添加查询参数
   * @param {Object} query - 查询参数
   * @returns {PaginationBuilder}
   */
  query(query) {
    Object.assign(this.params, query)
    return this
  }

  /**
   * 构建最终参数
   * @returns {Object}
   */
  build() {
    return {
      ...this.params,
      // 兼容后端对 current/size 的参数命名
      current: this.params.pageNum,
      size: this.params.pageSize
    }
  }
}

/**
 * 日期范围处理工具
 */
export class DateRangeHelper {
  /**
   * 处理日期范围参数
   * @param {Array} dateRange - 日期范围数组
   * @param {Object} params - 参数对象
   * @param {string} startKey - 开始时间字段名
   * @param {string} endKey - 结束时间字段名
   * @returns {Object} 处理后的参数
   */
  static processDateRange(dateRange, params = {}, startKey = 'startTime', endKey = 'endTime') {
    if (dateRange && dateRange.length === 2) {
      params[startKey] = dateRange[0]
      params[endKey] = dateRange[1]
    } else {
      params[startKey] = undefined
      params[endKey] = undefined
    }
    return params
  }

  /**
   * 格式化日期
   * @param {string|Date} date - 日期
   * @param {string} format - 格式
   * @returns {string} 格式化后的日期
   */
  static formatDate(date, format = 'YYYY-MM-DD') {
    if (!date) return ''
    
    const d = new Date(date)
    if (isNaN(d.getTime())) return ''

    const year = d.getFullYear()
    const month = String(d.getMonth() + 1).padStart(2, '0')
    const day = String(d.getDate()).padStart(2, '0')
    const hours = String(d.getHours()).padStart(2, '0')
    const minutes = String(d.getMinutes()).padStart(2, '0')
    const seconds = String(d.getSeconds()).padStart(2, '0')

    return format
      .replace('YYYY', year)
      .replace('MM', month)
      .replace('DD', day)
      .replace('HH', hours)
      .replace('mm', minutes)
      .replace('ss', seconds)
  }
}

/**
 * 表单验证工具
 */
export class FormValidator {
  /**
   * 验证必填字段
   * @param {string} message - 错误消息
   * @returns {Object} 验证规则
   */
  static required(message = '此字段不能为空') {
    return { required: true, message, trigger: 'blur' }
  }

  /**
   * 验证数字
   * @param {number} min - 最小值
   * @param {number} max - 最大值
   * @param {string} message - 错误消息
   * @returns {Object} 验证规则
   */
  static number(min = 0, max = Infinity, message) {
    return {
      type: 'number',
      min,
      max,
      message: message || `请输入${min}到${max}之间的数字`,
      trigger: 'blur'
    }
  }

  /**
   * 验证邮箱
   * @param {string} message - 错误消息
   * @returns {Object} 验证规则
   */
  static email(message = '请输入正确的邮箱地址') {
    return {
      type: 'email',
      message,
      trigger: 'blur'
    }
  }

  /**
   * 验证手机号
   * @param {string} message - 错误消息
   * @returns {Object} 验证规则
   */
  static phone(message = '请输入正确的手机号码') {
    return {
      pattern: /^1[3-9]\d{9}$/,
      message,
      trigger: 'blur'
    }
  }
}

/**
 * 导出工具
 */
export class ExportHelper {
  /**
   * 处理文件下载
   * @param {Blob} blob - 文件数据
   * @param {string} filename - 文件名
   */
  static downloadFile(blob, filename) {
    const url = window.URL.createObjectURL(blob)
    const link = document.createElement('a')
    link.href = url
    link.download = filename
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    window.URL.revokeObjectURL(url)
  }

  /**
   * 导出Excel
   * @param {Object} data - 数据
   * @param {string} filename - 文件名
   */
  static exportExcel(data, filename = 'export.xlsx') {
    // 这里需要根据项目使用的Excel库来调整
    // 假设使用xlsx库
    if (typeof window !== 'undefined' && window.XLSX) {
      const ws = window.XLSX.utils.json_to_sheet(data)
      const wb = window.XLSX.utils.book_new()
      window.XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
      window.XLSX.writeFile(wb, filename)
    } else {
      console.warn('XLSX库未加载，无法导出Excel')
    }
  }
}

